package com.sicheng.lc.周赛.分类.dp.字符串;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/7/19 22:58
 */
@SuppressWarnings("all")
public class 正则2 {
    // 此题是一道笔试题 笔试的时候不会做 此代码未经验证是否跑通所有用例
    // 匹配串中包含 . ? * 三种通配符
    // . 任意单个字符
    // ? 前面一个字符  repeat 1个或多个
    // * 前面一个字符  repeat 0个或多个
    public boolean isMatch(String s, String p) {

        int m = s.length();
        int n = p.length();
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true;
        int i = 0;
        for (int j = 1; j <= n; j++) {
            if (j >= 2)
                dp[i][j] = p.charAt(j - 1) == '*' & dp[i][j - 2];
            else
                dp[i][j] = p.charAt(j - 1) == '*';
        }


        for (i = 1; i <= m; i++) {
            char c1 = s.charAt(i - 1);
            for (int j = 1; j <= n; j++) {
                char c2 = p.charAt(j - 1);
                if (c2 == '*') {
                    if (j >= 2)
                        dp[i][j] = dp[i][j - 2] || (dp[i][j - 1] & (p.charAt(j - 2) == c1 || p.charAt(j - 2) == '.'));
                } else if (c2 == c1 || c2 == '.') {
                    dp[i][j] = dp[i - 1][j - 1];
                } else if (c2 == '?') {
                    if (j >= 2)
                        dp[i][j] = dp[i][j - 1] & (p.charAt(j - 2) == c1 || p.charAt(j - 2) == '.');
                }
            }
        }

        return dp[m][n];
    }
}
